import axios from "axios";
import { ElMessage } from "element-plus";

// 创建 axios 实例
const service = axios.create({
  baseURL: "/api", // 统一配置接口前缀
  timeout: 10000, // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 统一添加 headers，如 token
    const accessToken = localStorage.getItem("accessToken");
    if (accessToken) {
      config.headers.Authorization = `Bearer ${accessToken}`;
    }
    return config;
  },
  (error) => {
    ElMessage.error("请求错误，请重试");
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const res = response.data;
    if (res.code !== 0) {
      // 自定义处理错误消息
      ElMessage.error(res.msg || "请求失败");
      return Promise.reject(new Error(res.msg || "请求失败"));
    }
    return res;
  },
  async (error) => {
    const originalRequest = error.config;

    // 如果 access token 失效，尝试刷新
    if (
      error.response &&
      error.response.status === 401 &&
      !originalRequest._retry
    ) {
      originalRequest._retry = true; //如果没有 _retry，当刷新 token 失败，再次请求同样失败，会陷入死循环。这个标志位设置为 true 后，保证每个请求只尝试刷新一次。
      try {
        const refreshToken = localStorage.getItem("refreshToken");
        const res = await axios.post("/api/user/refresh-token", {
          refreshToken,
        });
        if (res.data.code === 0) {
          localStorage.setItem("accessToken", res.data.data.accessToken);
          originalRequest.headers.Authorization = `Bearer ${res.data.data.accessToken}`;
          return service(originalRequest); // 重新发起请求 service 是你封装的 axios 实例。
        }
      } catch (refreshError) {
        ElMessage.error("登录已过期，请重新登录");
        localStorage.removeItem("accessToken");
        localStorage.removeItem("refreshToken");
        // window.location.href = "/login";
      }
    }

    ElMessage.error(error.message || "网络异常");
    return Promise.reject(error);
  }
);

export default service;
